package servicesImpl;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import services.OrdenCompraService;
import services.XMLService;
import dao.OrdenCompraDAO;
import dao.impl.OrdenCompraDAOImpl;
import dominio.Cotizacion;
import dominio.Factura;
import dominio.Item;
import dominio.ListaPrecios;
import dominio.OrdenCompra;
import dominio.Rodamiento;

public class OrdenCompraServiceImpl extends UnicastRemoteObject implements OrdenCompraService {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private OrdenCompraDAO ocDAO;
	
	public OrdenCompraServiceImpl() throws RemoteException {
		super();
		ocDAO = OrdenCompraDAOImpl.getInstancia();
	}

	@Override
	public Factura generarOC(Cotizacion cot) throws RemoteException {
		Factura fac = new Factura();
		List<OrdenCompra> ordenes = new Vector<OrdenCompra>();
		fac.setCliente(cot.getCliente());
		fac.setFecha(new Date());
		List<Item> itemsFactura = new Vector<Item>();
		//fac.setDescuento(cot.getDescuento());
		//fac.setCondCompra(cot.getCondCompra());
		//TODO: verificar validez con fecha
		for (Item item : cot.getItems()) {
			Rodamiento rod = RodamientoServiceImpl.getInstancia().findByID(item.getRodamiento().getCodigoSKF());			
			if (rod.getStock()>=item.getCantidad()){
				Item itemFactura = new Item();
				itemFactura.setCantidad(item.getCantidad());
				itemFactura.setPrecio(item.getPrecio());
				Rodamiento rodParaItemOC = new Rodamiento();
				rodParaItemOC.setCodigoSKF(rod.getCodigoSKF());
				itemFactura.setRodamiento(rodParaItemOC);
				itemsFactura.add(itemFactura);
				fac.setMonto(fac.getMonto()+item.getCantidad()*item.getPrecio());
				rod.setStock(rod.getStock()-item.getCantidad());//Le sdescuento el stock facturado
				RodamientoServiceImpl.getInstancia().actualizar(rod);
			}
			else{
				//Separo al item entre el que va a la factura y el que va a la OC
				int stockViejo = rod.getStock();
				Item itemFactura = new Item();
				itemFactura.setCantidad(item.getCantidad());
				itemFactura.setPrecio(item.getPrecio());
				itemFactura.setRodamiento(rod);
				itemsFactura.add(itemFactura);
				fac.setMonto(fac.getMonto()+itemFactura.getCantidad()*itemFactura.getPrecio());
				rod.setStock(0);//Le sdescuento el stock facturado
				RodamientoServiceImpl.getInstancia().actualizar(rod);
				
				Item itemOC = new Item();
				itemOC.setCantidad(item.getCantidad()-stockViejo); 
				itemOC.setPrecio(obtenerPrecioDeLista(item));
				Rodamiento rodParaItemOC = new Rodamiento();
				rodParaItemOC.setCodigoSKF(rod.getCodigoSKF());
				itemOC.setRodamiento(rodParaItemOC);
				itemOC.setIsOferta(item.getIsOferta());
				itemOC.setNombreLista(item.getNombreLista());
				//Proveedor provParaItemOC
				itemOC.setProveedor(item.getProveedor());
				OrdenCompra oc = new OrdenCompra();
				oc.setProveedor(item.getProveedor());
				int ocIndice = ordenes.indexOf(oc);
				if (ocIndice >=0){
					oc =ordenes.get(ocIndice);
				}else{
					oc.setFecha(new Date());
					oc.setItems(new Vector<Item>());
					ordenes.add(oc);
				}
				oc.getItems().add(itemOC);
				oc.setMonto(oc.getMonto()+item.getCantidad()*item.getPrecio());
			}			
		}		
		if (!ordenes.isEmpty()){
			ocDAO.grabarOrdenesCompra(ordenes);
		}
		fac.setItems(itemsFactura);
		return fac;
	}

	private Float obtenerPrecioDeLista(Item item) {
		try {
			XMLService xmlService= new XMLServiceImpl();
			List<ListaPrecios> listas;
			listas = xmlService.leerXML();
			listas.addAll(xmlService.leerXmlLOF());
			for (ListaPrecios lista : listas) {
				int itemIndice =  lista.getItems().indexOf(item);
				if (itemIndice >= 0){
					Item itemLista = lista.getItems().get(itemIndice);
					if (itemLista.getIsOferta().equals(item.getIsOferta())){
						if (itemLista.getNombreLista().equals(item.getNombreLista())){
							return itemLista.getPrecio(); 
						}
					}
				}
			}
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return (float)0;
	}

}
